#include <iostream>
using namespace std;

/*
	虚析构为了解决特定的问题，发明的一种语法规则。
	告知大家特定的问题：
	    父类的指针指向子类的堆空间，delete父类指针，默认情况下只会调用父类的析构，不会调用子类的析构
	解决方法：
	    把父类的析构函数定义成虚析构
*/
class Animal
{
public:
	Animal()
	{
		cout<<"父类动物构造"<<endl;
	}
	virtual ~Animal()
	{
		cout<<"父类动物析构"<<endl;
	}
};

class Cat:public Animal
{
public:
	Cat()
	{
		cout<<"子类猫构造"<<endl;
	}
	~Cat()
	{
		cout<<"子类猫析构"<<endl;
	}
};

// void showAnimalEat(Animal *other)
// {
	// other->eat();
	// delete other;
// }

// Cat *c1=new Cat;
// Dog *d1=new Dog;
// showAnimalEat(c1);
// showAnimalEat(d1);



int main()
{
	Cat *c1=new Cat;
	//父类的指针指向子类对象
	Animal *p=c1;
	
	//释放堆空间
	delete c1; 
	//delete p;  //加了virtual，析构就正常了，不加virtual析构不彻底
	
}